package com.win.all.service.impl;

import com.win.all.service.IRedBagService;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;


/**
 * 随机数红包生成服务
 */
@Service
public class RedBagServiceImpl implements IRedBagService {


    /**
     * 生成随机数红包
     * 算法整体思路：
     * 1、每个红包先预留一分钱
     * 2、随机生成num-1个红包，用1到总剩下的钱/2  或者 1到总剩下的钱/总剩下未拆分红包 产生随机数
     * 3、最后一个红包为总金额-已拆分金额
     * 4、打乱红包顺序
     * @param total     红包总金额（单位：分）
     * @param num       红包个数
     * @param luckeyNum 幸运大红包个数（代表比较大的红包个数）
     * @return
     */
    @Override
    public List<Integer> getRedBagList(Integer total, int num, int luckeyNum) {
        if (total == null || total <= 0) {
            throw new IllegalArgumentException("参数-总金额-total必须大于0");
        }
        if (num > total) {
            throw new IllegalArgumentException("参数-总金额（单位:分）-total必须大于-num");
        }
        if (num <= 0) {
            throw new IllegalArgumentException("参数-红包个数-num必须大于0");
        }

        List<Integer> result = new ArrayList<>();

        //只发一个红包，不用运算，直接返回
        if (num == 1) {
            result.add(total);
            return result;
        }

        //剩余可以分的钱：保底一个红包1分钱，先扣掉保底的
        Integer remain = total - num;
        Random random = new Random();
        //随机产生num-1个红包，剩下最后一个是总的减去已分的
        for (int i = 0; i < num - 1; i++) {
            if (remain <= 0) {
                result.add(1);
                continue;
            }
            //本次抽取的最大值
            int max = 0;
            if (i < luckeyNum) {
                //优先抽大的，如果是要抽大红包则最大值是总剩余钱的中位数
                max = remain / 2;
            } else {
                //抽小的时候，最大值是剩余的钱的平均值
                max = remain / (num - i);
            }
            //本次抽取的红包
            int redBagItem = max == 0 ? 1 : random.nextInt(max);
            if (redBagItem > remain) {
                redBagItem = remain;
            }
            //需要加上一开始预留的保底的一分钱
            result.add(redBagItem + 1);
            remain = remain - redBagItem;
        }

        result.add(remain + 1);
        //打乱顺序，让大小红包分散一点
        Collections.shuffle(result);
        return result;
    }


}
